Data storage systems, such as disk storage arrays, are called upon to store and manage increasingly larger amounts of data, e.g., in gigabytes, terabytes, petabytes, and beyond. As a result, it is increasingly common or necessary that this large amount of data be distributed across multiple hard disk drives or other storage entities. Some conventional systems treat the collection of storage devices as a unified pool of data storage space that is divided into equal sized portions, where a portion may be as small as a single sector on a hard disk (e.g., 512 bytes) or as large as an entire hard disk drive, or even multiple hard disk drives.
One or more portions may be organized into collections called logical units. This process is referred to as allocating a portion to a logical unit. Once a portion has been allocated to a logical unit, that portion is exclusively used by the logical unit. Portions that have not been organized into or associated with a logical unit are referred to as unallocated portions. A logical unit can be a subset of a single storage device, e.g., a hard disk drive may contain multiple logical units; a logical unit can be an entire storage device; and a logical unit can span multiple storage devices, e.g., a logical unit may be distributed across multiple storage devices organized into a redundant array of inexpensive disks (RAID) array.
A requesting entity, such as an application, program, operating system, and the like, may request that a certain amount of data storage space be allocated for the requesting entity's use, e.g., into which the requesting entity will store data. The process of requesting and receiving storage space is hereinafter generically referred to as “storage allocation”. When an entity makes a storage allocation request, the data storage system may have multiple portions available for allocation to the requesting entity. In this situation, the data storage system may perform a selection process to select the portion to be allocated. This selection process may include reading allocation information, maintained by the disk storage device or the data storage system, that indicates which portions of the memory are allocated, and to whom. The selection process identifies a portion of memory to be allocated to the requesting entity, and the allocation information must be updated to reflect this allocation. Allocation information is typically stored in non-volatile storage, such as in a database. Thus, a conventional allocation process includes accessing a database in order to read and later write or update allocation information, which is expensive in terms of time and resources.
For storage systems that perform storage allocation in advance, the time taken to read and write the allocation information is not critical. However, some storage systems do not allocate storage until the storage is actually needed. In these storage systems, a storage allocation request may be issued in response to an I/O write request, i.e., a request to store data to a storage device. In this scenario, the data storage system may receive an I/O write to a logical unit, determine that the logical unit does not have enough space to store the data to be written, and make a storage allocation request for more storage space. In response to a storage allocation request that was triggered by an I/O write, the storage system must select a portion to be allocated, allocate the selected portion, write the data into the allocated portion, and commit the transaction, i.e., update the allocation information within the database to reflect the fact that a previously unallocated portion of data storage has been allocated and that the I/O write was successful (or unsuccessful.)
In conventional storage systems, the next I/O operation cannot be processed until the previous I/O operation has been committed. There are disadvantages associated with the conventional approach just described. One disadvantage is that, when a storage allocation is triggered by an I/O write, the allocation information is accessed twice: once during the selection process and again during the allocation process. Because accessing the database to read or write the allocation information is expensive in terms of time, this limits the number of I/O writes that may be processed per unit of time, since the next I/O write cannot be processed until the allocation information has been updated from the previous I/O write. The I/O latency is also increased due to the fact that the database transaction must be completed before completing the I/O operation.
These disadvantages are exacerbated for storage systems that do not allocate space in advance, but instead allocate space as needed, i.e., at the time that the I/O write is received. In such systems the time required to access and update the allocation information can significantly reduce the performance of the overall system, because an I/O operation that triggers an allocation can put subsequent I/O operations on hold until the allocation process completes.
Accordingly, in light of these disadvantages associated with the conventional approach, there exists a need for systems, methods, and computer readable media for performance optimization of storage allocation to virtual logical units.